﻿using System;
using System.Linq;
using Csla;
using Csla.Data;
using Csla.Tools;
using DemoCSLA.DalLinq;

namespace DemoCSLA.Libreria.SoloLectura
{

    //******************************************
    //Clase generada por un Snippet de Erick Orlando © 2010
    //******************************************


    [Serializable()]
    public class ClientesInfoList : ReadOnlyListBase<ClientesInfoList, ClientesInfo>
    {
        #region Métodos de instanciación

        private ClientesInfoList()
        { }

        public static ClientesInfoList GetClientesInfoList()
        {
            //Sin Filtros
            return DataPortal.Fetch<ClientesInfoList>(new FiltroCriteria());
        }

        /// <summary>
        /// Funcion que permite filtrar los Objetos InfoList basados en 
        /// Varios parámetros
        /// </summary>
        public static ClientesInfoList GetClientesInfoList(ICriterio Criterio)
        {
            return DataPortal.Fetch<ClientesInfoList>(Criterio);
        }

        #endregion // Métodos de instanciación

        #region Criterios

        [Serializable()]
        public class FiltroCriteria : ICriterio
        {
            public FiltroCriteria()
            {}

            public string Nombres { get; set; }
            public string Apellidos { get; set; }

            //Si necesita mas filtros agruegelos aqui

            #region Miembros de ICriterio

            string ICriterio.NombreClaseCriterio
            {
                get { return this.GetType().Name; }
            }

            #endregion
        }

        #endregion //Criterios

        #region Data Access

        #region Data Access - Fetch

        private void DataPortal_Fetch(FiltroCriteria crit)
        {
            RaiseListChangedEvents = false;
            IsReadOnly = false;

            using (var ctx = ContextManager<DemoCSLADataContext>
                .GetManager(Contexto.DemoCSLA))
            {

                IQueryable<Cliente> clientes;

                if (!String.IsNullOrEmpty(crit.Nombres))
                    clientes = Cliente.GetClienteByNombres(ctx.DataContext, crit.Nombres);
                else if (!String.IsNullOrEmpty(crit.Apellidos))
                    clientes = Cliente.GetClienteByApellidos(ctx.DataContext, crit.Apellidos);
                else
                    clientes = Cliente.GetAllClientes(ctx.DataContext);

                foreach (var item in clientes)
                {
                    this.Add( ClientesInfo.GetClientesInfo(item) );
                }
            }

            IsReadOnly = true;
            RaiseListChangedEvents = true;
        }

        #endregion // Data Access - Fetch

        #endregion // Data Access



    }

}
